#pragma once
#include "TaskQueue.h"
#include "TaskQueue.cpp"


//线程池模板类
template<typename T>
class ThreadPool
{
public:
	//初始化线程池
	ThreadPool();
	ThreadPool(int min, int max);

	//析构函数：销毁线程池
	~ThreadPool();

	//添加任务
	void add_task(Task<T> task);

	//获取线程池中工作的线程个数
	int get_busy_num();

	//获取线程池中活着的线程个数
	int get_alive_num();

private:
	//工作的线程（消费者线程）任务函数
	static void* worker(void* arg);

	//管理者线程任务函数
	static void* manager(void* arg);

	//单个线程退出
	void thread_exit();

private:
	TaskQueue<T>* m_tasks;

	pthread_t m_manager_id;						//管理者线程id
	pthread_t* m_thread_ids;					//工作的线程id

	int m_min_num;								//最小的线程数量（核心线程数）
	int m_max_num;								//最大线程数
	int m_busy_num;								//忙的线程的个数
	int m_alive_num;								//存活的线程个数
	int m_exit_num;								//需要销毁的线程个数

	pthread_mutex_t m_mx;						//互斥锁
	pthread_cond_t  m_not_empty;				//条件变量 判断任务队列是否为空来通知生产者

	bool shutdown;								//用来判断是否需要销毁线程池的 真：销毁
	
	static const int NUMBER = 2;                //一次创建或销毁多少条线程
};
